<script language="javascript" type="text/javascript">

var persona;
var diaSeleccionado;
var editable;//esta vaina indica si me deja pintar cualquier celda, creo que nunca lo usaremos XD
var dragging;//interno, solo util para editable = true
var actividades;
var selectedHeader;//dia seleccionado
var selectedRange;//turno de personal en un dia seleccionado
var selectedCell;//del rango seleccionado, q hora esta seleccionada para ver su detalle
var horario;//arreglo de arreglo de rangos, el primer nivel son los dias y el segundo nivel son los rangos de hora asignados para ese dia
var headerCells;
var lunes;

var cellSelectStyle = 'btn-success';
var cellSelect2Style = 'btn-inverse';

var body;
var cbActividades;
var cbDesde;
var cbHasta;
var btnAddTurno;
var btnRemoveTurno;
var btnVacaciones;
var btnRepetir;
var cbRepeticiones;
var datePickerHorario;
var msgDiv;
var personaDiv;
var detalleHoraDiv;
var actividadesDiv;


function msg(tipo, titulo, msg){
    msgDiv.html("\
        <div class='alert alert-"+tipo+"'>\
            <button type='button' class='close' data-dismiss='alert'>×</button><strong>"+
            titulo+"</strong> "+msg+
        "</div>");
}

function mostrarDetalle(){

    if (selectedCell == null) {
        //limpiar
        detalleHoraDiv.html("");
        actividadesDiv.html("");
        return;
    }

    var dia = selectedCell.attr("iDia");
    var hora = selectedCell.attr("iHora");

    detalleHoraDiv.html("");

    var str = "";
    str += latisoft_openTable("Hora", "Paciente", "Estado", "Detalle");
    
    var citas = horario.dias[dia].citas[hora];

    for (var i in citas){
        var cita = citas[i];
        console.log(cita);
       

        var link = "<?php echo base_url();?>";
        link += "cita/detallecita/"+cita.id;
        /*
        if (cita.especialidad == <?php echo ID_ESP_CITAAMBULATORIA?> ||
            cita.especialidad == <?php echo ID_ESP_EMERGENCIAS?>){
            if (cita.estado == 0){
                link += "ambulatoria/registrarConsulta/1/"+cita.id;
            }else
            if (cita.estado == 1){
                link += "ambulatoria/detalle?idProcedimiento"+cita.idProcedimiento;
            }
        }else
        if (cita.especialidad == <?php echo ID_ESP_EXAMENES?>){
            if (cita.estado == 0){
                link += "examen/registrarProcedimiento/1/"+cita.id;
            }else
            if (cita.estado == 1){
                link += "examen/registrarExamen/1/"+cita.id;
            }
        }else
        if (cita.especialidad == <?php echo ID_ESP_HOSPITALIZACION?>){
            if (cita.estado == 0){
                link += "hospitalizacion/asignacionCI?idCita="+cita.id;
            }else
            if (cita.estado == 1){
                link += "hospitalizacion/verHospitalizacion?idProcedimiento="+cita.idProcedimiento;
            }
        }
        */
        var strEstado;
        if (cita.estado == 0){
            strEstado = "Reservada";
        }else if (cita.estado == 1){
            strEstado = "Atendida";
        }

        str += latisoft_tableRow(cita.hora,
                                cita.paciente.nombre,
                                strEstado,
                                "<a href='"+link+"'>Ver</a>");
    
    }

    /*
    var str = "";
    str += latisoft_openTable("Hora", "Paciente", "Estado", "Detalle");

    for (var i=0; i<60; i+=5){
        var ceros;
        if (i.toString().length == 1){
            ceros = "0";
        }else{
            ceros = "";
        }
        var mins = ceros+i;

        var min5i = selectedRange.iDia*24*60/5 + hora*60/5 + i/5;
        var cita = horario.citasMin5[min5i];

        if (cita.paciente != undefined){
            var link = "<?php echo base_url();?>";

            if (cita.especialidad == <?php echo ID_ESP_CITAAMBULATORIA?> ||
                cita.especialidad == <?php echo ID_ESP_EMERGENCIAS?>){
                if (cita.estado == 0){
                    link += "ambulatoria/registrarConsulta/1/"+cita.id;
                }else
                if (cita.estado == 1){
                    link += "ambulatoria/detalle?idProcedimiento"+cita.idProcedimiento;
                }
            }else
            if (cita.especialidad == <?php echo ID_ESP_EXAMENES?>){
                if (cita.estado == 0){
                    link += "examen/registrarProcedimiento/1/"+cita.id;
                }else
                if (cita.estado == 1){
                    link += "examen/registrarExamen/1/"+cita.id;
                }
            }else
            if (cita.especialidad == <?php echo ID_ESP_HOSPITALIZACION?>){
                if (cita.estado == 0){
                    link += "hospitalizacion/asignacionCI?idCita="+cita.id;
                }else
                if (cita.estado == 1){
                    link += "hospitalizacion/verHospitalizacion?idProcedimiento="+cita.idProcedimiento;
                }
            }

            var strEstado;
            if (cita.estado == 0){
                strEstado = "Reservada";
            }else if (cita.estado == 1){
                strEstado = "Atendida";
            }

            str += latisoft_tableRow(""+hora+":"+mins,
                                    cita.paciente.nombre,
                                    strEstado,
                                    "<a href='"+link+"'>Ver</a>");
        }else{
            str += latisoft_tableRow(""+hora+":"+mins, "", "", "");
        }
    }
    str += latisoft_closeTable();
    */

    detalleHoraDiv.append(str);


    //mostrar actividades
    actividadesDiv.html("");
    var str = "";
    str += "<b>Ambiente:</b> "+selectedRange.ambiente.nombre+"<br/>";
    str += "<b>Actividades:</b><br/>";
    str += latisoft_openTable("Id", "Actividad", "Eliminar");
    for (var i=0; i<selectedRange.actividades.length; i++){
        idEspecialidad = selectedRange.actividades[i].id;
        strEliminar = "<a onclick=\'eliminarActividad("+idEspecialidad+")\'>"+"Eliminar"+"</a>";
        str += latisoft_tableRow(selectedRange.actividades[i].id, selectedRange.actividades[i].nombre, strEliminar);
    }
    str += latisoft_closeTable();

    actividadesDiv.append(str);

}

function eliminarActividad(idEspecialidad){    
    var fecha = horario.dias[Number(selectedRange.iDia)].fechaSql;
    var desde = Number(selectedRange.hora0);
    var hasta = Number(selectedRange.hora1);

    msg("info", "Aviso", "Eliminando actividad...");

    $.ajax(
    {
        url: <?php echo "'".base_url()."horario/wsDeleteRango'"; ?>,
        type: 'GET',
        dataType: 'json',
        data:{idPersona:persona.id, desde:desde, hasta:hasta, fecha:fecha, idEspecialidad:idEspecialidad},
        cache: false,
        beforeSend: function() {
        },
        success: function(data){
            msg("success", "Aviso", "Se ha eliminado la actividad.");
            cargarHorario();
            selectedCell = null;
            mostrarDetalle();
        },
        error: function(xhr, textStatus, errorThrown) {
            msg("error", "Error", "Ha ocurrido un error al intentar eliminar la actividad.");
        }
    });
}

function calendarCell_onMouseDown(event){
    var cell = $(event.currentTarget);

    //seleccionar todo el range si es una celda con range
    var iRange = cell.attr("iRange");
    var iRangeDia = cell.attr("iRangeDia");
    var iHora = cell.attr("iHora");
    if (iRange != -1){
        //hemos presionado una celda que SÍ pertenece a un rango
        var range = horario.dias[iRangeDia].rangos[iRange];

        if (selectedRange != null){
            deselectRange(selectedRange);
            if (selectedCell != null){
                //visualSelect es igual q un vistualDeselect2, por eso no existe este ultimo
                if (selectedRange == range){
                    //si presiona sobre el mismo rango, la celda sigue seleccionada(1)
                    visualSelectCell(selectedCell);
                }else{
                    //si presiona en otro rango, la celda se debe deseleccionar
                    visualDeselectCell(selectedCell);
                }
            }
        }

        if (selectedCell != cell){
            selectRange(range);
            visualSelectCell2(cell);
            selectedRange = range;
            selectedCell = cell;
            mostrarDetalle();
        }else{
            selectedRange = null;
            selectedCell = null;
        }
    }

    if (!editable) return;
    dragging = true;
    invertCell(cell);
}

function getConsistentRowf(row0, rowf){
    var nRow0 = Number(row0);
    var nRowf = Number(rowf);
    
    if (nRowf < nRow0){
        nRowf += 24;
    }
    return nRowf;
}

function deselectRange(range){
    var iDia = range.iDia;
    for (var i=Number(range.hora0); i<getConsistentRowf(range.hora0, range.hora1); i++){
        var rangeCell = getCalendarCell(iDia, i);
        visualDeselectCell(rangeCell);
    }
}

function selectRange(range){
    var iDia = range.iDia;
    for (var i=Number(range.hora0); i<getConsistentRowf(range.hora0, range.hora1); i++){
        var rangeCell = getCalendarCell(iDia, i);
        visualSelectCell(rangeCell);
    }
}


function visualSelectCell2(cell){
    cell.removeClass('is-hidden');
    cell.removeClass('is-visible');
    cell.removeClass(cellSelectStyle);
    cell.addClass(cellSelect2Style);
}

function visualDeselectCell(cell){
    cell.addClass('is-visible');
    cell.removeClass(cellSelectStyle);
    cell.removeClass(cellSelect2Style);
}

function visualSelectCell(cell){
    cell.removeClass('is-hidden');
    cell.removeClass('is-visible');
    cell.removeClass(cellSelect2Style);
    cell.addClass(cellSelectStyle);
}

function calendarCell_onMouseEnter(event){
    if (!editable) return;
    if (!dragging) return;
    var cell = $(event.currentTarget);
    invertCell(cell);
}

function invertCell(cell){
    if (cell.hasClass('is-hidden')){
        setVisible(cell);
    }else{
        setHidden(cell);
    }
}

function setHidden(cell){
    cell.removeClass('is-visible');
    cell.addClass('is-hidden');
}

function setVisible(cell){
    cell.addClass('is-visible');
    cell.removeClass('is-hidden');
}

function headerCell_onMouseDown(event){
    var cell = $(event.currentTarget);
    setInactiveHeader(selectedHeader);
    setActiveHeader(cell);
    selectedHeader = cell;
}

function setActiveHeader(cell){
    cell.addClass('btn-primary');
}

function setInactiveHeader(cell){
    cell.removeClass('btn-primary');
}

function clearCells(){
    for (var fil=0; fil<48; fil++){
        for (var col=0; col<7; col++){
            var cell = $("#cell-"+fil+"-"+col);
            cell.attr("iRange", -1);
            cell.attr("iRangeDia", -1);
            setHidden(cell);
            visualDeselectCell(cell);
            cell.html("");
        }
    }
}

function drawTurno(dia, row0, rowf, actividades, iRange){
    //se llama draw turno pero en realidad dibuja una fraccion
    //o sea, un turno en un dia, o un rango
    for (var i=Number(row0); i<getConsistentRowf(row0, rowf); i++){
        var cell = getCalendarCell(dia, i);
        cell.attr("iRange", iRange);
        cell.attr("iRangeDia", dia);
        setVisible(cell);

        var strActividades = actividades[0].nombre;
        if (actividades.length > 1){
            strActividades += " ("+(actividades.length-1)+"+)";
        }
        cell.html(strActividades);
    }
}

function updateActividades(){
    cbActividades.html("");
    cbActividades.append("<option value='-1'></option>");
    for (var i in actividades){
        cbActividades.append("<option value='"+i+"'>"+actividades[i].nombre+"</option>");
    }

    cbActividades.trigger("liszt:updated");
}

function updateHorario(){
    clearCells();
    for (var i in horario.dias){
        //para cada dia
        var cell = $("#cell-th-"+i);
        cell.attr("i", i);
        cell.html(horario.dias[i].nombre+" "+horario.dias[i].fechaHtml);

        cell.mousedown(headerCell_onMouseDown);

        var dia = horario.dias[i];
        for (var j in dia.rangos){
            //para cada rango de cada dia
            var rango = dia.rangos[j];
            drawTurno(i, rango.hora0, rango.hora1, rango.actividades, j);
        }
    }
}

function iToHora(i){
    var ceros;
    if (i.length == 1){
        ceros = "0";
    }else{
        ceros = "";
    }
    return ceros+i+":00";
}

function cargarActividades(){
    $.ajax(
    {
        url: <?php echo "'".base_url()."horario/wsGetActividades'"; ?>,
        type: 'GET',
        dataType: 'json',
        cache: false,
        beforeSend: function() {
        },
        success: function(data){
            actividades = data;
            updateActividades();
        },
        error: function(xhr, textStatus, errorThrown) {
            msg("error", "Error", "Ha ocurrido un error al cargar las actividades");
        }
    });
}

function cargarHorario(){
    if (diaSeleccionado == null) diaSeleccionado = new Date();
    var strDia = diaSeleccionado.getFullYear()+"-"+(Number(diaSeleccionado.getMonth())+1)+"-"+diaSeleccionado.getDate();
    
    msg("info", "Aviso", "Recargando horario...");

    $.ajax(
    {
        url: <?php echo "'".base_url()."horario/wsGetHorario'"; ?>,
        type: 'GET',
        dataType: 'json',
        data:{idPersona: persona.id, lunes: strDia},
        cache: false,
        beforeSend: function() {
        },
        success: function(data){
            horario = data;
            updateHorario();
            lunes = Number(horario.lunes)*1000;
            msg("success", "Aviso", "Se ha recargado el horario.");

            mostrarDetalle();
        },
        error: function(xhr, textStatus, errorThrown) {
            msg("error", "Error", "Ha ocurrido un error al cargar el horario");
        }
    });
}

function btnRemoveTurno_onClick(event){
    var fecha = horario.dias[Number(selectedRange.iDia)].fechaSql;
    var desde = Number(selectedRange.hora0);
    var hasta = Number(selectedRange.hora1);

    msg("info", "Aviso", "Eliminando turno...");

    $.ajax(
    {
        url: <?php echo "'".base_url()."horario/wsDeleteRango'"; ?>,
        type: 'GET',
        dataType: 'json',
        data:{idPersona:persona.id, desde:desde, hasta:hasta, fecha:fecha, idEspecialidad:""},
        cache: false,
        beforeSend: function() {
        },
        success: function(data){
            msg("success", "Aviso", "Se ha eliminado el turno.");
            cargarHorario();
            selectedRange = null;
            selectedCell = null;
            mostrarDetalle();
        },
        error: function(xhr, textStatus, errorThrown) {
            msg("error", "Error", "Ha ocurrido un error al intentar eliminar el rango.");
        }
    });
}

function btnAddTurno_onClick(event){
    var desde = Number(cbDesde.val());

    if (desde == null){
        alert("Seleccione una hora de inicio.");
        return;
    }

    var hasta = Number(cbHasta.val());

    if (hasta == null){
        alert("Seleccione una hora de fin");
        return;
    }

    var fecha = horario.dias[Number(selectedHeader.attr("i"))].fechaSql;

    msg("info", "Aviso", "Agregando turno...");
    //var idAmbienteSeleccionado = -1;

    $.ajax(
    {
        url: <?php echo "'".base_url()."horario/wsInsertRango'"; ?>,
        type: 'GET',
        data: {idPersona: persona.id, desde:desde, hasta:hasta, idActividad:idEspecialidadSeleccionada, fecha:fecha, idAmbiente:idAmbienteSeleccionado},
        dataType: 'json',
        cache: false,
        beforeSend: function() {
        },
        success: function(data){
            msg("success", "Aviso", "Se ha agregado el turno.");
            cargarHorario();
        },
        error: function(xhr, textStatus, errorThrown) {
            msg("error", "Error", "Ha ocurrido un error al intentar insertar el turno.");
        }
    });

}

function btnVacaciones_onClick(event){
    var desde = 0;
    var hasta = 24;
    var fecha = horario.dias[Number(selectedHeader.attr("i"))].fechaSql;

    msg("info", "Aviso", "Registrando vacaciones...");
    var idAmbienteSeleccionado = -1;

    var idActividadVacaciones = <?php echo ID_ESP_VACACIONES;?>;

    $.ajax(
    {
        url: <?php echo "'".base_url()."horario/wsInsertRango'"; ?>,
        type: 'GET',
        data: {idPersona: persona.id, desde:desde, hasta:hasta, idActividad:idActividadVacaciones, fecha:fecha, idAmbiente:idAmbienteSeleccionado},
        dataType: 'json',
        cache: false,
        beforeSend: function() {
        },
        success: function(data){
            msg("success", "Aviso", "Se ha registrado las vacaciones.");
            cargarHorario();
        },
        error: function(xhr, textStatus, errorThrown) {
            msg("error", "Error", "Ha ocurrido un error al intentar registrar vacaciones.");
        }
    });
}

function btnRepetir_onClick(event){
    var lunesEnviar = new Date();
    lunesEnviar.setTime(lunes);
    var strDia = lunesEnviar.getFullYear()+"-"+(Number(lunesEnviar.getMonth())+1)+"-"+lunesEnviar.getDate();
    var repeticiones = cbRepeticiones.val();
    msg("info", "Aviso", "Generando repeticiones...");

    $.ajax(
    {
        url: <?php echo "'".base_url()."horario/wsRepetir'"; ?>,
        type: 'GET',
        data: {idPersona: persona.id, lunes: strDia, semanas: repeticiones},
        dataType: 'json',
        cache: false,
        beforeSend: function() {
        },
        success: function(data){
            msg("success", "Aviso", "Se ha repetido el horario por "+repeticiones+" semanas.");
            cargarHorario();
        },
        error: function(xhr, textStatus, errorThrown) {
            msg("error", "Error", "Ha ocurrido un error al intentar repetir el horario.");
        }
    });
}

function onChangeDate(event){
    diaSeleccionado = event.date;
    var iDia = diaSeleccionado.getDay();
    
    setInactiveHeader(selectedHeader);

    var iDia2 = iDia -1;
    if (iDia2 == -1) iDia2 = 6;    
    selectedHeader = headerCells[iDia2];
    setActiveHeader(selectedHeader);

    //recargar horario solo cuando hay cambio de semana
    sigLunes = Number(lunes) + 7*24*60*60*1000;
    var msecs = diaSeleccionado.getTime();
    if (msecs < lunes ||
        msecs > sigLunes){
        cargarHorario();
    }

}

function getCalendarCell(dia, hora){
    var horaP = hora;
    if (hora >= 24){
        horaP -= 24;
        dia ++;
    }
    return $("#cell-"+horaP+"-"+dia);
}

function iniCalendarCells(){
    for (var fil=0; fil<24; fil++){
        for (var col=0; col<7; col++){
            var cell = getCalendarCell(col, fil);
            cell.attr("iRange", -1);
            cell.attr("iRangeDia", -1);
            cell.attr("iDia", col);
            cell.attr("iHora", fil);
            cell.mousedown(calendarCell_onMouseDown);
            cell.mouseenter(calendarCell_onMouseEnter);
        }
    }
}

function iniHeaderCells(iSelected){
    headerCells = new Array();

    for (var i=0; i<7; i++){
        var cell = $("#cell-th-"+i);
        cell.attr("i", i);
        cell.mousedown(headerCell_onMouseDown);
        headerCells.push(cell);
        if (i == iSelected){
            selectedHeader = cell;
            setActiveHeader(cell);
        }
    }

}

function storeElements(){
    body = $("body");
    //cbTurnos = $("#cbTurnos");
    //cbActividades = $("#cbActividades");
    cbDesde = $("#cbDesde");
    cbHasta = $("#cbHasta");
    btnAddTurno = $("#btnAddTurno");
    btnRemoveTurno = $("#btnRemoveTurno");
    datePickerHorario = $("#datePickerHorario");
    msgDiv = $("#msgDiv");
    personaDiv = $("#personaDiv");
    btnRepetir = $("#btnRepetir");
    cbRepeticiones = $("#cbRepeticiones");
    detalleHoraDiv = $("#detalleHoraDiv");
    actividadesDiv = $("#actividadesDiv");
    btnVacaciones = $("#btnVacaciones");
}

function onReady(){
    dragging = false;
    editable = false;
    diaActual = new Date();
    diaSeleccionado = null;

    var iDia = diaActual.getDay();
    
    iniHeaderCells(iDia);
    iniCalendarCells();
    storeElements();

    body.mouseup(function(){
        dragging = false;
    });

    datePickerHorario.datepicker().on('changeDate', onChangeDate);

    selectedRange = null;
    selectedCell = null;

    <?php
        $usuario=$this->session->userdata('logged_in');
        $idPersona=$usuario['persona'];
        $idPerfil=$usuario['perfil'];

        if ($idPerfil == PERFIL_ADMINISTRADOR || $idPerfil == PERFIL_RECURSOS_HUMANOS){
            echo "
            btnVacaciones.click(btnVacaciones_onClick);
            btnAddTurno.click(btnAddTurno_onClick);
            btnRemoveTurno.click(btnRemoveTurno_onClick);
            btnRepetir.click(btnRepetir_onClick);
            iniCombosEspecialidad(".$personaSeleccionada['Persona'].");
            iniCombosAmbiente();
            ";
        }
    ?>
    

    persona = { id: "<?php echo $personaSeleccionada['Persona'] ?>",
                nombres: "<?php echo $personaSeleccionada['Nombres'] ?>",
                apellidoPat: "<?php echo $personaSeleccionada['Apellido_Paterno'] ?>",
                apellidoMat: "<?php echo $personaSeleccionada['Apellido_Materno'] ?>"
                };
    cargarHorario();
    personaDiv.html(persona.nombres+" "+persona.apellidoPat);


    

}

</script>